//输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。 
//
// 
//
// 示例 1： 
//
// 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
//输出：[1,2,3,6,9,8,7,4,5]
// 
//
// 示例 2： 
//
// 输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
//输出：[1,2,3,4,8,12,11,10,9,5,6,7]
// 
//
// 
//
// 限制： 
//
// 
// 0 <= matrix.length <= 100 
// 0 <= matrix[i].length <= 100 
// 
//
// 注意：本题与主站 54 题相同：https://leetcode-cn.com/problems/spiral-matrix/ 
//
// Related Topics 数组 矩阵 模拟 👍 523 👎 0


package leetcode.editor.cn;

// [剑指 Offer 29]顺时针打印矩阵

public class ShunShiZhenDaYinJuZhenLcof_JianZhiOffer29 {
    public static void main(String[] args) {
        Solution solution = new ShunShiZhenDaYinJuZhenLcof_JianZhiOffer29().new Solution();
        solution.spiralOrder(new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}});
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public int[] spiralOrder(int[][] matrix) {
            if (matrix.length == 0 || matrix[0].length == 0) {
                return new int[0];
            }
            int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1;
            int i = 0, j = 0;
            int[] ans = new int[(r + 1) * (b + 1)];
            int x = 0;
            while (true) {
                for (j = l; j <= r; j++) {
                    ans[x++] = matrix[i][j];
                }
                j--;
                if (++t > b) {
                    break;
                }
                for (i = t; i <= b; i++) {
                    ans[x++] = matrix[i][j];
                }
                i--;
                if (--r < l) {
                    break;
                }
                for (j = r; j >= l; j--) {
                    ans[x++] = matrix[i][j];
                }
                j++;
                if (--b < t) {
                    break;
                }
                for (i = b; i >= t; i--) {
                    ans[x++] = matrix[i][j];
                }
                i++;
                if (++l > r) {
                    break;
                }
            }
            return ans;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}